package xdu.lz.stage1_basic.chapter2_api.e_close;

public class ThreadService {
    //自定义一个线程，来把要做任务的线程设定为自定义线程的守护线程。
    //通过暴力关闭自定义的线程，来让任务线程结束。
    private Thread executeThread;

    private volatile boolean finished = false;

    public void execute(Runnable task){
        executeThread = new Thread(() -> {
            //这是原来要执行的任务
            Thread runner = new Thread(task);
            runner.setDaemon(true);
            runner.start();

            try {
                //一直执行任务线程,假设预计30min，如果超出30min可以通过关闭executeThread来让任务线程自动关闭
                //这里是executeThread来join的，通过打断executeThread捕获，然后退出
                runner.join();
                //如果执行完毕标记
                finished = true;
                System.out.println("111");
            } catch (InterruptedException e) {
                System.out.println("executeThread被打断,结束executeThread，其守护线程task任务也被结束");

            }
        });
        executeThread.start();
    }
    public void shutdown(long mills){
        long currentTime = System.currentTimeMillis();
        //如果任务没有结束，才需要等待超时，不然直接关闭即可
        while (!finished){
            if(System.currentTimeMillis() - currentTime > mills){
                System.out.println("任务超时 ，已经关闭!");
                //通过打断executeThread来让其关闭，进一步让task关闭
                executeThread.interrupt();
                break;
            }
        }
        finished = false;
    }



}
